#ifndef LOGGER_H
#define LOGGER_H

#include "lockqueue.h"
#include <string>

// Mprpc框架提供的日志系统
enum class LogLevel {
    DEBUG,   // 调试信息，通常只在开发环境中使用
    INFO,    // 普通信息，确认程序按预期运行
    WARN,    // 警告信息，表示需要注意的情况，但不会影响程序的正常运行
    ERROR,   // 错误信息，表示出现了问题，可能会影响部分功能
    FATAL    // 致命错误，表示出现了严重的问题，可能导致程序无法继续运行
};

class Logger
{
public:
    // 获取单例实例
    static Logger& GetInstance();
    // 设置日志级别
    void SetLogLevel(LogLevel loglevel);
    // 写日志
    void Log(std::string msg);
private:
    Logger(); // 私有构造函数，防止外部实例化
    ~Logger(); // 析构函数也应为私有以完整实现单例模式
    Logger(const Logger&) = delete; // 禁止拷贝构造
    Logger& operator=(const Logger&) = delete; // 禁止赋值操作

    LogLevel m_loglevel; // 记录日志级别
    LockQueue<std::string> m_lockqueue; // 日志缓冲队列
};

// 定义一个内部使用的宏来减少重复
#define LOG_INTERNAL(level, logmsgformat, ...) \
    do \
    { \
        Logger & logger = Logger::GetInstance(); \
        logger.SetLogLevel(level); \
        char c[1024]; \
        snprintf(c, sizeof(c), logmsgformat, ##__VA_ARGS__); \
        logger.Log(c); \
    } while(0)

// 使用内部宏定义具体的日志级别宏
#define LOG_INFO(logmsgformat, ...) LOG_INTERNAL(LogLevel::INFO, logmsgformat, ##__VA_ARGS__)
#define LOG_ERROR(logmsgformat, ...) LOG_INTERNAL(LogLevel::ERROR, logmsgformat, ##__VA_ARGS__)

// 如果需要其他日志级别，可以类似地定义
#define LOG_DEBUG(logmsgformat, ...) LOG_INTERNAL(LogLevel::DEBUG, logmsgformat, ##__VA_ARGS__)
#define LOG_WARN(logmsgformat, ...) LOG_INTERNAL(LogLevel::WARN, logmsgformat, ##__VA_ARGS__)
#define LOG_FATAL(logmsgformat, ...) LOG_INTERNAL(LogLevel::FATAL, logmsgformat, ##__VA_ARGS__)

#endif